package model

import (
	"common/global"
	"errors"
	"gorm.io/gorm"
	"time"
)

type MedicalProduct struct {
	Id        int64     `gorm:"column:id;type:mediumint;comment:商品id;primaryKey;not null;" json:"id"`                                     // 商品id
	Image     string    `gorm:"column:image;type:varchar(256);comment:商品图片;not null;" json:"image"`                                       // 商品图片
	StoreName string    `gorm:"column:store_name;type:varchar(128);comment:商品名称;not null;" json:"store_name"`                             // 商品名称
	StoreInfo string    `gorm:"column:store_info;type:varchar(256);comment:商品简介;not null;" json:"store_info"`                             // 商品简介
	CateId    int64     `gorm:"column:cate_id;type:int;comment:分类id;not null;" json:"cate_id"`                                            // 分类id
	Keyword   string    `gorm:"column:keyword;type:varchar(256);comment:关键字;not null;" json:"keyword"`                                    // 关键字
	IsHot     int8      `gorm:"column:is_hot;type:tinyint(1);comment:是否热卖（0否 1是）;not null;default:0;" json:"is_hot"`                      // 是否热卖（0否 1是）
	IsPostage uint8     `gorm:"column:is_postage;type:tinyint UNSIGNED;comment:是否包邮（0否 1是）;not null;default:0;" json:"is_postage"`        // 是否包邮（0否 1是）
	Price     float32   `gorm:"column:price;type:decimal(8, 2) UNSIGNED;comment:商品价格;not null;default:0.00;" json:"price"`                // 商品价格
	VipPrice  float32   `gorm:"column:vip_price;type:decimal(8, 2) UNSIGNED;comment:会员价格;not null;default:0.00;" json:"vip_price"`        // 会员价格
	OtPrice   float32   `gorm:"column:ot_price;type:decimal(8, 2) UNSIGNED;comment:市场价;not null;default:0.00;" json:"ot_price"`           // 市场价
	Postage   float32   `gorm:"column:postage;type:decimal(8, 2) UNSIGNED;comment:邮费;not null;default:0.00;" json:"postage"`              // 邮费
	Sales     int64     `gorm:"column:sales;type:mediumint UNSIGNED;comment:销量;not null;default:0;" json:"sales"`                         // 销量
	Stock     int64     `gorm:"column:stock;type:mediumint UNSIGNED;comment:库存;not null;default:0;" json:"stock"`                         // 库存
	Collect   int64     `gorm:"column:collect;type:int;comment:收藏数;default:NULL;" json:"collect"`                                         // 收藏数
	Browse    int64     `gorm:"column:browse;type:int;comment:浏览量;default:0;" json:"browse"`                                              // 浏览量
	CreatedAt time.Time `gorm:"column:created_at;type:datetime(3);comment:添加时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"` // 添加时间
	UpdatedAt time.Time `gorm:"column:updated_at;type:datetime(3);comment:修改时间;not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"` // 修改时间
	DeletedAt time.Time `gorm:"column:deleted_at;type:datetime(3);comment:删除时间;default:NULL;" json:"deleted_at"`                          // 删除时间
}

func (m *MedicalProduct) TableName() string {
	return "medical_product"
}

// KeyWordsQuery 关键字查询
func KeyWordsQuery(words string, query *gorm.DB) (result []*MedicalProduct, err error) {
	err = query.Where("keyword LIKE ?", "%"+words+"%").Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// NewQuery 新品查询
func NewQuery(ago time.Time, query *gorm.DB) (result []*MedicalProduct, err error) {
	err = query.Where("created_at > ?", ago).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// ProductCateList 分类查询
func ProductCateList(subCategoryIDs []uint, query *gorm.DB) (result []*MedicalProduct, err error) {
	err = query.Where("cate_id IN ?", subCategoryIDs).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// ProductList 商品列表查询
func ProductList(query *gorm.DB, offset int64, size int64) (result []*MedicalProduct, err error) {
	err = query.Offset(int(offset)).Limit(int(size)).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// GetProductInfo 商品详情
func GetProductInfo(pid int64) (product *MedicalProduct, err error) {
	if err = global.Db.Model(&MedicalProduct{}).Where("id =?", pid).Limit(1).Find(&product).Error; err != nil {
		return nil, err
	}
	return product, nil
}

// ProductStockAdd 回滚库存（支付失败时使用）
func ProductStockAdd(id int64, num int64) error {
	err := global.Db.Model(&MedicalProduct{}).Where("id = ?", id).Update("stock", gorm.Expr("stock + ?", num)).Error
	if err != nil {
		return err
	}
	return nil
}

// 改进的库存扣减函数，增加库存检查
func ProductStockDel(id int64, num int64) error {
	// 使用乐观锁扣减库存，防止超卖
	result := global.Db.Model(&MedicalProduct{}).Where("id = ? AND stock >= ?", id, num).Update("stock", gorm.Expr("stock - ?", num))
	if result.Error != nil {
		return result.Error
	}

	if result.RowsAffected == 0 {
		return errors.New("库存不足，扣减失败")
	}

	return nil
}
